import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import AbilityStage from '@ohos.app.ability.AbilityStage';
import { Configuration } from '@ohos.app.ability.Configuration';
import Want from '@ohos.app.ability.Want';
import Logger from '../common/utils/Logger';

/**
 * AbilityStage 是一个 Module 级别的组件容器，应用的HAP在首次加载时会创建一个AbilityStage实例，可以对该Module进行初始化等操作。
 * AbilityStage 与 Module 一一对应，即一个Module拥有一个AbilityStage。
 * DevEco Studio默认工程中未自动生成AbilityStage，如需要使用AbilityStage的能力，可以手动新建一个AbilityStage文件，具体步骤如下:
 * 1.在工程Module对应的ets目录下新建一个目录并命名为 myabilitystage。
 * 2.在myabilitystage目录下新建一个TypeScript文件并命名为MyAbilityStage.ts。
 * 3.打开MyAbilityStage.ts文件，导入AbilityStage的依赖包，自定义类继承AbilityStage并加上需要的生命周期回调，示例中增加了一个onCreate()生命周期回调。
 * ```ts
 * import AbilityStage from '@ohos.app.ability.AbilityStage';
 * export default class MyAbilityStage extends AbilityStage {
 *   ...
 * }
 * ```
 * 4.在module.json5配置文件中，通过配置srcEntry参数来指定模块对应的代码路径，以作为HAP加载的入口。
 * ```json
 * {
 *  "module": {
 *    "name": "entry",
 *    "type": "entry",
 *    "srcEntry": "./ets/myabilitystage/MyAbilityStage.ts",
 *    ...
 *  }
 * }
 * ```
 *
 * AbilityStage拥有onCreate()生命周期回调和onAcceptWant()、onConfigurationUpdated()、onMemoryLevel()事件回调:
 * 生命周期回调：
 *  onCreate()：在开始加载对应Module的第一个UIAbility实例之前会先创建AbilityStage，并在AbilityStage创建完成之后执行其onCreate()生命周期回调。
 *        AbilityStage模块提供在Module加载的时候，通知开发者，可以在此进行该Module的初始化（如资源预加载，线程创建等）能力。
 *
 * 事件回调：
 *  onAcceptWant()： UIAbility指定实例模式（specified）启动时候触发的事件回调，具体使用请参见UIAbility启动模式综述。
 *  onConfigurationUpdated()：当系统全局配置发生变更时触发的事件，系统语言、深浅色等，配置项目前均定义在Configuration类中。
 *  onMemoryLevel()：当系统调整内存时触发的事件。
 *
 */
export default class MyAbilityStage extends AbilityStage {
  private readonly TAG: string = 'MyAbilityStage';

  /**
   * 生命周期回调。在第一个UIAbility实例之前会先创建AbilityStage，并在AbilityStage创建完成之后执行其onCreate()生命周期回调
   */
  onCreate() {
    Logger.info(this.TAG, 'onCreate');
    // 获取 ApplicationContext 实例对象
    let applicationContext = this.context.getApplicationContext();
  }

  /**
   * 事件回调：仅当UIAbility指定实例模式（specified）启动时候触发的事件回调
   * @param want
   * @returns
   */
  onAcceptWant(want: Want) {
    Logger.info(this.TAG, 'onAcceptWant,want:' + JSON.stringify(want));
    return ''
  }

  /**
   * 事件回调：当系统全局配置发生变更时触发的事件，系统语言、深浅色等，配置项目前均定义在Configuration类中
   * @param config
   */
  onConfigurationUpdate(config: Configuration) {
    Logger.info(this.TAG, 'onConfigurationUpdate,config:' + JSON.stringify(config));
  }

  /**
   * 事件回调：当系统调整内存时触发的事件。
   * 应用被切换到后台时，系统会将在后台的应用保留在缓存中。即使应用处于缓存中，也会影响系统整体性能。
   * 当系统资源不足时，系统会通过多种方式从应用中回收内存，必要时会完全停止应用，从而释放内存用于执行关键任务。
   * 为了进一步保持系统内存的平衡，避免系统停止用户的应用进程，可以在AbilityStage中的onMemoryLevel()生命周期回调中订阅系统内存的变化情况，释放不必要的资源。
   * @param level
   */
  onMemoryLevel(level: AbilityConstant.MemoryLevel) {
    Logger.info(this.TAG, 'onMemoryLevel,level:' + JSON.stringify(level));
    // 根据系统可用内存的变化情况，释放不必要的内存
  }
}